from user import User
from card import Card
import random


class ATM:
    def __init__(self, all_user):
        self.all_user = all_user  # 所有用户

    # 随机生成开户卡号
    def random_card_id(self):
        while True:
            str_data = ''  # 存储卡号
            for i in range(6):  # 随机生成6位卡号
                ch = chr(random.randrange(ord('0'), ord('9') + 1))
                str_data += ch
            if not self.all_user.get(str):  # 判断卡号是否重复
                return str_data

    # 开户
    def create_user(self):
        # 目标向用户字典中添加一个键值对（卡号、用户对象）
        name = input("请输入姓名:")
        user_id = input("请输入身份证号:")
        phone = input("请输入手机号:")
        prest_money = float(input("请输入预存金额:"))
        if prest_money <= 0:
            print("预存款输入有误，开户失败！")
            return -1  # 开户失败
        once_pwd = input("请输入密码：")
        password = input("请再次输入密码：")
        if password != once_pwd:
            print("两次密码输入不同......")
            return -1
        print("密码设置成功，请牢记密码:  %s " % password)
        card_id = self.random_card_id()
        card = Card(card_id, once_pwd, prest_money)  # 创建卡
        user = User(name, user_id, phone, card)  # 创建用户
        self.all_user[card_id] = user  # 存入用户字典
        print("您的开户已完成，请牢记开户卡号: %s" % card_id)

    # 校验密码，连续输错3次密码会退出系统
    def check_pwd(self, real_pwd):
        for i in range(3):
            psd2 = input("请输入密码：")
            if real_pwd == psd2:
                return True
        print("密码输错三次，系统自动退出......")
        return False

    # 锁定
    def lock_card(self):
        input_card_id = input("请输入您的卡号：")
        user = self.all_user.get(input_card_id)
        if not user:
            print("此卡号不存在...锁定失败！")
            return -1
        if user.card.card_lock:
            print("该卡已经被锁定，无需再次锁定！")
            return -1
        if not self.check_pwd(user.card.card_pwd):  # 验证密码
            print("密码错误...锁定失败！！")
            return -1
        user.card.card_lock = True
        print("该卡被锁定成功！")

    # 查询
    def search_user(self, base=1):
        if base == 2:
            inpt_card_id = input("请输入转出主卡号：")
        elif base == 3:
            inpt_card_id = input("请输入转入卡号：")
        elif base == 1:
            inpt_card_id = input("请输入您的卡号：")
        user = self.all_user.get(inpt_card_id)
        # 判断卡号是否存在
        if not user:
            print("此卡号不存在...查询失败！")
            return -1
        if user.card.card_lock:
            print("该用户已经被锁定...请解卡后使用！")
            return -1
        if not self.check_pwd(user.card.card_pwd):  # 校验密码
            print("密码错误过多...卡已经被锁定，请解卡后使用！")
            user.card.card_lock = True
            return -1

        if not base == 3:  # 查询转入卡号   不打印余额
            print("卡号: %s   余额: %.2f  " % (user.card.card_id, user.card.money))
        return user

    # 取款
    def get_money(self):
        user_tf = self.search_user()
        if user_tf != -1:
            if user_tf.card.card_id != '':
                input_money = float(input("请输入取款金额:"))
                if input_money > int(user_tf.card.money):
                    print("输入的金额大于余额，请先查询余额！")
                    return -1
                user_tf.card.money = float(user_tf.card.money) - input_money
                print("取款成功！  卡号: %s   余额: %.2f  " % (user_tf.card.card_id, user_tf.card.money))
        else:
            return -1

    # 存款
    def save_money(self):
        user_tf = self.search_user()
        if user_tf != -1:
            if user_tf.card.card_id != '':
                input_money = float(input("请输入要存入得金额:"))
                if input_money < 0:
                    print("请输入正确金额！")
                else:
                    user_tf.card.money += input_money
                    print("存款成功！  卡号: %s   余额: %.2f  " %
                          (user_tf.card.card_id, user_tf.card.money))
        else:
            return -1

    # 转账
    def transfer_money(self):
        # 校验转出主卡号与密码
        master_tf = self.search_user(base=2)
        if master_tf == -1:
            return -1
        # 校验转入卡号与密码
        user_tf = self.search_user(base=3)
        if user_tf == -1:
            return -1
        in_tr_money = float(input("请输入转账金额："))
        # 判断卡号余额是否大于或等于转账金额
        if master_tf.card.money >= in_tr_money:  # 符合转账条件
            opt_str = input("您确认要继续转账操作吗（y/n）？：")
            # 确认用户是否转账
            if opt_str.upper() == "Y":  # 转账
                master_tf.card.money -= in_tr_money
                user_tf.card.money += in_tr_money
                print("转账成功！  卡号: %s   余额: %.2f  " %
                      (master_tf.card.card_id, master_tf.card.money))
            else:  # 不转账
                print("转账失败，中止了操作...")
        else:  # 不符合转账条件
            print("转账失败，余额不足！  卡号: %s   余额: %.2f  " %
                  (master_tf.card.card_id, master_tf.card.money))

    # 解锁
    def unlock_card(self):
        inpt_card_id = input("请输入您的卡号：")
        user = self.all_user.get(inpt_card_id)
        while 1:
            if not self.all_user.get(inpt_card_id):
                print("此卡号不存在...解锁失败！")
                return -1
            elif not user.card.card_lock:
                print("该卡未被锁定，无需解锁！")
                break
            elif not self.check_pwd(user.card.card_pwd):
                print("密码错误...解锁失败！！")
                return -1
            user.card.card_lock = False  # 解锁
            print("该卡解锁成功！")
            break
